﻿/*
 *      	MSP430FE425中与I/O操作相关的一些宏定义.
 *
 * 		作者：匿名
 *
 *		本软件为自由软件，你可以自由修改和发布.期望它能对你有所益处.
 *               
 *		最后修正时间：2008/7/20
 *		
 *		版权所有：中文中国
 */
#ifndef __N6100__
#define __N6100__
#include "ctype.h"


#define COMMAND   0x00     // Indicates a "command" byte was writed
#define DATA      0x01     // Indicates a "DATA" byte was writed

#define ROWSET    0x2A     // Row address set  (command 0x2B) 
#define CLUSET    0x2B     // Column address set  (command 0x2A) 
#define RAMWRITE  0x2C     // Write Memory  (command  0x2C)
#define SLEEPOUT  0x11     // Sleep out  (command 0x11) 
#define INVON     0x20     // Inversion on  (command 0x20) , seems to be required for this controller 
#define MOMACCTL  0x3A     // Memory access controller  (command 0x36).
#define SETCON    0x25     // Write contrast  (command 0x25) 
#define CONTRAST  0x30     //contrast 0x30
#define DISPLAYON 0x29     // Display On  (command 0x29)

#define COLORMOD  0x36     //Color Interface Pixel Format  (command 0x3A) 
#define COLOR8    0x02     // 8 bits-per-pixel (data 0x02) 
#define COLOR12   0x03     // 12 bits-per-pixel (data 0x03)
#define COLOR16   0x05     // 16 bits-per-pixel (data 0x05)
#define N6100 1
#define endl '\n'

#define ZERO 0
#define ONE  10
#define TWO  100
#define THREE 1000
#define FOUR  10000

typedef enum{ForGColor=1,BackGColor,XCurrent,YCurrent,ScrGColor,Left=125,Right,Center,Precision}Set;
typedef enum {left=125,right=126,center=127}Alignment;
/*以下为设置类,当设置不同的参数时,其设置值只能取系统规定的值,否则的话将出现无法预测的结果,
  其对应设置参数的取值如下:
  Left,Right,Center:无跟随参数值,即系统有预留的默认值
  ForGColor,BackGColor,ScrGColor:Color::*,也可取任意的16位整数值,强烈建议取系统规定的色彩值
  Precision:ZERO,ONE,TWO,THREE,FOUR
  XCurrent,YCurrent:取0-131之间的整数值
*/

class set{
public:
      Set name;
      unsigned int color;
      int position;

public:
      set(Set str,unsigned int color=0){
           name=str;
           switch(str){
                 case ForGColor:
                 case BackGColor:
                 case ScrGColor:
                 case Precision: this->color=color;break;
                 case XCurrent:
                 case YCurrent:this->position=color;break;
           }
          
      }
};
class invalidate{
public:
      int xstart;
      int ystart;
      int width;
      int height;
public:
      invalidate(int xstart=0,int ystart=0,int width=131,int height=131){
            this->xstart=xstart;
            this->ystart=ystart;
            this-> width= width;
            this->height=height;
      }
};

class clear:public invalidate{
     
};
class Color{
public:
      static const unsigned int Blue=0x00f0;
      static const unsigned int Green=0x000f;
      static const unsigned int Black=0x00ff;
      static const unsigned int White=0x0000;
      static const unsigned int Red=0x00f0;
      static const unsigned int Orange=0x000f;
      static const unsigned int Mental=0x00f0;
      static const unsigned int Purple=0x000f;
};
class _N6100{
public:
      _N6100(unsigned int BackGroundColor=0xff,unsigned int ForGroundColor=0xf0,unsigned int ScrGroundColor=0x00);
      //void setForGroundColor(unsigned char FGC);//该函数已经不再使用,可通过(_N6100对象)<<set(parameter,value),parameter和value的具体取值请见说明文档
      //void setBackGroundColor(unsigned char BGC);//同上
      virtual void waveLine();
      void clear();
      void drawimage(const char* image,int xstart,int ystart,int width,int height);
private:
      //以下各函数的参数均是基于像素点为单位的
      void line(int xstart,int ystart,int xstop,int ystop);
      void circle(int xstart,int ystart,int radius,float linewidth=0.5);//linewidth:线宽,该值会影响画圆的速度
      void rectangle(int xstart,int ystart,int width,int height,unsigned char fill);
      void printf(char *str,int xstart=0,int ystart=0);
      void printf(float mod,char *str);//这样定义是没有实在意义的,其作用主要在于用来解决重载带来的问题
      void drawimage( const char* image,Rectangle rec);
      //void drawimage( const char* image,int xstart,int ystart, int width, int height);
      void setBox(int xstart,int xstop,int ystart,int ystop);
      void write(unsigned char datatemp,unsigned char mod);     
      void init();//初始化函数,能常被构造函数调用,对lcd进行一些初参数设置.
      
private:
      //以下为Lcd的全部属性值,它描述了lcd当前的显示环境
      int xcurrent;
      int ycurrent;
      Alignment alignment;        //该属性用于描述字符输出的显示议,如左对齐,右对齐,居中等
      unsigned int precision;     //该属性用于描述所要显示小数点后的数字的位数(即显示精度),该值仅对浮点数的显示输出有影响
      unsigned int BackGroundColor;//显示图形或汉字的背景色
      unsigned int ForGroundColor;//显示图形或汉字的前景色
      unsigned int ScrGroundColor;//与BackGroundColor不同,它是整个屏幕的背景色
      struct{char buffer[50];int length;int position;}buffer;
public:
      
      _N6100 & operator <<(char *str); //字符输函数
      _N6100 & operator <<(char ch);
      _N6100 & operator <<(int num);
      _N6100 & operator <<(float num);
      _N6100 & operator >>(char *str);
      _N6100 & operator <<(_N6100 *);
      
      _N6100 & operator <<(Point point);//作图函数
      _N6100 & operator <<(Line lin); 
      _N6100 & operator <<(WaveLine wavlin); 
      _N6100 & operator <<(Rectangle rec);
      _N6100 & operator <<(Circle cir); 
      
      _N6100 & operator <<(set setp); //设置函数
      _N6100 & operator <<(invalidate inv); 
};

extern _N6100 cout;

#endif

